/**
 * 此文件为grunt的入口文件，用于定义一些需要grunt自动执行的任务，需要导出一个函数，此函数接收一个grunt的形参，内部提供一些创建任务时可以用到的API
 */

const sass = require('sass')
const loadGruntTasks = require('load-grunt-tasks')

module.exports = grunt => {
  // 配置选项方法，多目标任务
  grunt.initConfig({
    foo: {
      bar: '123',
    },
    build: {
      // options时配置选项，不会被执行
      options: {
        foo: 'bar',
      },
      css: {
        options: {
          foo: 'baz',
        },
      },
      js: 2,
    },
    clean: {
      dist: 'dist/**',
    },
    sass: {
      options: {
        sourceMap: true,
        implementation: sass,
      },
      main: {
        files: {
          'dist/css/main.css': 'src/scss/main.scss',
        },
      },
    },
    babel: {
      options: {
        sourceMap: true,
        presets: ['@babel/preset-env'],
      },
      main: {
        files: {
          'dist/js/app.js': 'src/js/app.js',
        },
      },
    },
    watch: {
      js: {
        files: ['src/js/*.js'],
        tasks: ['babel']
      },
      css: {
        files: ['src/css/*.css'],
        tasks: ['sass']
      },
    },
  })

  // yarn grunt clean
  // grunt.loadNpmTasks('grunt-contrib-clean')
  // grunt.loadNpmTasks('grunt-sass')
  loadGruntTasks(grunt) // 自动加载所有的grunt插件中的任务

  // 多目标任务，可单独运行多目标中的某一个yarn grunt build:css
  grunt.registerMultiTask('build', function () {
    // 通过this.options()拿配置选项
    console.log(this.options())
    console.log(`build task: ${this.target}, data: ${this.data}`)
  })

  grunt.registerTask('foo', () => {
    console.log('hello grunt')
    // 获取initConfig
    const config = grunt.config()
    console.log(config)
  })

  // 第二个参数为任务描述，可以在yarn grunt --help中查看描述
  grunt.registerTask('bar', '任务描述', () => {
    console.log('bar task')
  })

  // 异步任务需要用this.async指明，且不能用箭头函数作为回调
  grunt.registerTask('async-task', function () {
    const done = this.async()
    setTimeout(() => {
      console.log('async task')
      // 此时需要调用done来手动结束任务
      done()
    }, 2000)
  })

  // 失败的标记任务会阻止后面的任务继续执行，需要用--force强制执行
  grunt.registerTask('bad', () => {
    console.log('bad task')
    return false
  })

  // 失败的标记异步需在回调done里传false
  grunt.registerTask('async-bad', () => {
    const done = this.async()
    setTimeout(() => {
      console.log('async bad task')
      // 此时需要调用done来手动结束任务
      done(false)
    }, 2000)
  })

  // default为默认任务，grunt会自动调用
  grunt.registerTask('default', ['sass', 'babel', 'watch'])
}